/* *******************************************************
    Nuevas tablas sobre medios de contacto / comunicacion.
    Por ahora solo las usa Java.
 ********************************************************* */

--TABLAS
DROP TABLE IF EXISTS padmedcomfun;
DROP TABLE IF EXISTS padmedcom;

DROP TABLE IF EXISTS padmedtipxpadmedfun;
DROP TABLE IF EXISTS padmedtip;
DROP TABLE IF EXISTS padmedfun;

/*-----------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------*/
CREATE TABLE padmedtip
(
  cod character varying(15) NOT NULL, -- codigo del tipo de medio de comunicacion
  nombre character varying(50) NOT NULL, -- nombre del tipo de medio de comunicacion
  mascara character varying(50), -- expresion regular que valida el tipo de medio de comunicacion
  orden integer NOT NULL, --orden del tipo de medio de comunicacion 
  idambdb integer, -- Identificador de la instancia
  fechainsert timestamp without time zone, -- Fecha y hora de alta del registro
  fechaupdate timestamp without time zone, -- Fecha y hora ultima actualizacion del registro
  CONSTRAINT padmedtip_pkey PRIMARY KEY (cod)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE padmedtip  OWNER TO abacouser;
COMMENT ON TABLE padmedtip IS 'Tipos de medio de comunicacion';

COMMENT ON COLUMN padmedtip.cod IS 'codigo del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedtip.nombre IS 'nombre del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedtip.mascara IS 'expresion regular que valida el tipo de medio de comunicacion';
COMMENT ON COLUMN padmedtip.orden IS 'orden del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedtip.idambdb IS 'Identificador de la instancia';
COMMENT ON COLUMN padmedtip.fechainsert IS 'Fecha y hora de alta del registro';
COMMENT ON COLUMN padmedtip.fechaupdate IS 'Fecha y hora ultima actualizacion del registro';
/*-----------------------------------------------------------------------------------------------------------------*/
CREATE TABLE padmedfun
(
  cod character varying(15) NOT NULL, -- codigo de la funcion para el medio de comunicacion
  nombre character varying(50) NOT NULL, -- nombre de la funcion para el medio de comunicacion
  orden integer NOT NULL, --orden de la funcion para el medio de comunicacion
  idambdb integer, -- Identificador de la instancia
  fechainsert timestamp without time zone, -- Fecha y hora de alta del registro
  fechaupdate timestamp without time zone, -- Fecha y hora ultima actualizacion del registro
  CONSTRAINT padmedfun_pkey PRIMARY KEY (cod)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE padmedfun OWNER TO abacouser;
COMMENT ON TABLE padmedfun IS 'Funciones para el medio de comunicacion';

COMMENT ON COLUMN padmedfun.cod IS 'codigo de la funcion para el medio de comunicacion';
COMMENT ON COLUMN padmedfun.nombre IS 'nombre de la funcion para el medio de comunicacion';
COMMENT ON COLUMN padmedfun.orden IS 'orden de la funcion para el medio de comunicacion';
COMMENT ON COLUMN padmedfun.idambdb IS 'Identificador de la instancia';
COMMENT ON COLUMN padmedfun.fechainsert IS 'Fecha y hora de alta del registro';
COMMENT ON COLUMN padmedfun.fechaupdate IS 'Fecha y hora ultima actualizacion del registro';
/*-----------------------------------------------------------------------------------------------------------------*/
CREATE TABLE padmedtipxpadmedfun
(
  id integer NOT NULL, --identificador del registro
  tipopada character varying(3) NOT NULL, --tipo del arbol de rubros
  codpadr character varying(20) NOT NULL, --codigo del rubro de padron
  codpadmedtip character varying(15) NOT NULL, --codigo del tipo de medio de comunicacion
  codpadmedfun character varying(15) NOT NULL, --codigo de la funcion para el medio de comunicacion
  requerido char(1) NOT NULL, --indica si es obligatorio (valores posibles S(si)/No(no))
  idambdb integer, -- Identificador de la instancia
  fechainsert timestamp without time zone, -- Fecha y hora de alta del registro
  fechaupdate timestamp without time zone, -- Fecha y hora ultima actualizacion del registro
  CONSTRAINT padmedtipxpadmedfun_pkey PRIMARY KEY (id),
  CONSTRAINT gestion_ai_padrpadmedtipxpadmedfun FOREIGN KEY (tipopada, codpadr)
      REFERENCES padr (tipopada, cod) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT gestion_ai_padmedtippadmedtipxpadmedfun FOREIGN KEY (codpadmedtip)
      REFERENCES padmedtip (cod) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT gestion_ai_padmedfunpadmedtipxpadmedfun FOREIGN KEY (codpadmedfun)
      REFERENCES padmedfun (cod) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT gestion_ai_checkrequerido CHECK (requerido = 'S' OR requerido = 'N'),
  CONSTRAINT gestion_ai_mediocomunicacionfuncionrubropadron UNIQUE (tipopada, codpadr, codpadmedtip, codpadmedfun) 
)
WITH (
  OIDS=TRUE
);
ALTER TABLE padmedtipxpadmedfun OWNER TO abacouser;
COMMENT ON TABLE padmedtipxpadmedfun IS 'Configuracion de tipos de medio de comunicacion y funciones asociadas por rubro de padron';

COMMENT ON COLUMN padmedtipxpadmedfun.id IS 'identificador del registro';
COMMENT ON COLUMN padmedtipxpadmedfun.tipopada IS 'tipo del arbol de rubros';
COMMENT ON COLUMN padmedtipxpadmedfun.codpadr IS 'codigo del rubro de padron';
COMMENT ON COLUMN padmedtipxpadmedfun.codpadmedtip IS 'codigo del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedtipxpadmedfun.codpadmedfun IS 'codigo de la funcion para el medio de comunicacion';
COMMENT ON COLUMN padmedtipxpadmedfun.requerido IS 'indica si es obligatorio (valores posibles S=si/N=no)';
COMMENT ON COLUMN padmedtipxpadmedfun.idambdb IS 'Identificador de la instancia';
COMMENT ON COLUMN padmedtipxpadmedfun.fechainsert IS 'Fecha y hora de alta del registro';
COMMENT ON COLUMN padmedtipxpadmedfun.fechaupdate IS 'Fecha y hora ultima actualizacion del registro';
/*-----------------------------------------------------------------------------------------------------------------*/
CREATE TABLE padmedcom
(
  id integer NOT NULL, --identificador del registro
  idpad integer NOT NULL, --identificador del padron 
  codpadmedtip character varying(15) NOT NULL, --codigo del tipo de medio de comunicacion
  valor character varying(256) NOT NULL, --valor del tipo de medio de comunicacion
  descripcion character varying(500), --informacion extra
  idambdb integer, -- Identificador de la instancia
  fechainsert timestamp without time zone, -- Fecha y hora de alta del registro
  fechaupdate timestamp without time zone, -- Fecha y hora ultima actualizacion del registro
  CONSTRAINT padmedcom_pkey PRIMARY KEY (id),
  CONSTRAINT gestion_ai_padpadmedcom FOREIGN KEY (idpad)
      REFERENCES pad (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE, 
  CONSTRAINT gestion_ai_padmedtippadmedcom FOREIGN KEY (codpadmedtip)
      REFERENCES padmedtip (cod) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT gestion_ai_mediocomunicacion UNIQUE (idpad,codpadmedtip,valor) 
)
WITH (
  OIDS=TRUE
);
ALTER TABLE padmedcom  OWNER TO abacouser;
COMMENT ON TABLE padmedcom IS 'Medios de comunicacion de un padron';

COMMENT ON COLUMN padmedcom.id IS 'dentificador del registro';
COMMENT ON COLUMN padmedcom.idpad IS 'identificador del padron'; 
COMMENT ON COLUMN padmedcom.codpadmedtip IS 'codigo del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedcom.valor IS 'valor del tipo de medio de comunicacion';
COMMENT ON COLUMN padmedcom.descripcion IS 'informacion extra';
COMMENT ON COLUMN padmedcom.idambdb IS 'Identificador de la instancia';
COMMENT ON COLUMN padmedcom.fechainsert IS 'Fecha y hora de alta del registro';
COMMENT ON COLUMN padmedcom.fechaupdate IS 'Fecha y hora ultima actualizacion del registro';
/*-----------------------------------------------------------------------------------------------------------------*/
CREATE TABLE padmedcomfun
(
  id integer NOT NULL, --identificador del registro
  idpadmedcom integer NOT NULL, --identificador del medio de comunicacion del padron
  codpadmedfun character varying(15) NOT NULL, -- codigo de la funcion para el medio de comunicacion
  obs character varying(500), --informacion extra
  idambdb integer, -- Identificador de la instancia
  fechainsert timestamp without time zone, -- Fecha y hora de alta del registro
  fechaupdate timestamp without time zone, -- Fecha y hora ultima actualizacion del registro
  CONSTRAINT padmedcomfun_pkey PRIMARY KEY (id), 
  CONSTRAINT gestion_ai_padmedcompadmedcomfun FOREIGN KEY (idpadmedcom)
      REFERENCES padmedcom (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE,
  CONSTRAINT gestion_ai_padmedfunpadmedcomfun FOREIGN KEY (codpadmedfun)
      REFERENCES padmedfun (cod) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,     
  CONSTRAINT gestion_ai_mediocomunicacionfuncion UNIQUE (idpadmedcom,codpadmedfun) 
)
WITH (
  OIDS=TRUE
);
ALTER TABLE padmedcomfun  OWNER TO abacouser;
COMMENT ON TABLE padmedcomfun IS 'Funcion asociada al medio de comunicacion de un padron';

COMMENT ON COLUMN padmedcomfun.id IS 'dentificador del registro';
COMMENT ON COLUMN padmedcomfun.idpadmedcom IS 'identificador del medio de comunicacion del padron';
COMMENT ON COLUMN padmedcomfun.codpadmedfun IS 'codigo de la funcion para el medio de comunicacion';
COMMENT ON COLUMN padmedcomfun.obs IS 'informacion extra';
COMMENT ON COLUMN padmedcomfun.idambdb IS 'Identificador de la instancia';
COMMENT ON COLUMN padmedcomfun.fechainsert IS 'Fecha y hora de alta del registro';
COMMENT ON COLUMN padmedcomfun.fechaupdate IS 'Fecha y hora ultima actualizacion del registro';
/*-----------------------------------------------------------------------------------------------------------------*/  
--SECUENCIAS
DROP SEQUENCE IF EXISTS seq_padmedtipxpadmedfun;
CREATE SEQUENCE seq_padmedtipxpadmedfun
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE seq_padmedtipxpadmedfun OWNER TO abacouser;
-------------------------------------------------------------------------------------------------
DROP SEQUENCE IF EXISTS seq_padmedcom;
CREATE SEQUENCE seq_padmedcom
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE seq_padmedcom OWNER TO abacouser;
-------------------------------------------------------------------------------------------------
DROP SEQUENCE IF EXISTS seq_padmedcomfun;
CREATE SEQUENCE seq_padmedcomfun
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE seq_padmedcomfun OWNER TO abacouser;
-------------------------------------------------------------------------------------------------

--INSERTS iniciales
DELETE FROM padmedtip;
INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('MAIL', 'Correo Electronico', '^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$', 1);

INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('CELULAR', 'Celular', '^[15]?([0-9-()/\s])*$', 2);

INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('TELEFONO', 'Telefono fijo', '^([0-9-()/\s])*$', 3);   

INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('FACEBOOK', 'Facebook', NULL, 4);

INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('TWITTER', 'Twitter', NULL, 5);

INSERT INTO padmedtip (cod, nombre, mascara, orden)
VALUES('INSTAGRAM', 'Instagram', NULL, 6);
--------------------------------------------------------------------------------------------------
DELETE FROM padmedfun;
INSERT INTO padmedfun(cod, nombre, orden)
VALUES('FACT', 'Facturas', 1);

INSERT INTO padmedfun(cod, nombre, orden)
VALUES('RESCTA', 'Resumen de Cuenta', 2);

INSERT INTO padmedfun(cod, nombre, orden)
VALUES('MANTIS', 'Mantis', 3);

INSERT INTO padmedfun(cod, nombre, orden)
VALUES('AVISO', 'Aviso gral. al cliente', 4);
/*-----------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------*/

DROP TRIGGER IF EXISTS control_audit_padmedtip ON padmedtip;

CREATE TRIGGER control_audit_padmedtip
  BEFORE INSERT OR UPDATE OR DELETE
  ON padmedtip
  FOR EACH ROW
  EXECUTE PROCEDURE tg_control_audit_instancia();
----------------------------------------------------------------------------------
DROP TRIGGER IF EXISTS control_audit_padmedfun ON padmedfun;

CREATE TRIGGER control_audit_padmedfun
  BEFORE INSERT OR UPDATE OR DELETE
  ON padmedfun
  FOR EACH ROW
  EXECUTE PROCEDURE tg_control_audit_instancia();
----------------------------------------------------------------------------------
DROP TRIGGER IF EXISTS control_audit_padmedtipxpadmedfun ON padmedtipxpadmedfun;

CREATE TRIGGER control_audit_padmedtipxpadmedfun
  BEFORE INSERT OR UPDATE OR DELETE
  ON padmedtipxpadmedfun
  FOR EACH ROW
  EXECUTE PROCEDURE tg_control_audit_instancia();
----------------------------------------------------------------------------------
DROP TRIGGER IF EXISTS control_audit_padmedcom ON padmedcom;

CREATE TRIGGER control_audit_padmedcom
  BEFORE INSERT OR UPDATE OR DELETE
  ON padmedcom
  FOR EACH ROW
  EXECUTE PROCEDURE tg_control_audit_instancia();
----------------------------------------------------------------------------------
DROP TRIGGER IF EXISTS control_audit_padmedcomfun ON padmedcomfun;

CREATE TRIGGER control_audit_padmedcomfun
  BEFORE INSERT OR UPDATE OR DELETE
  ON padmedcomfun
  FOR EACH ROW
  EXECUTE PROCEDURE tg_control_audit_instancia();
/*-----------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------*/
ALTER TABLE padmedtip
ADD COLUMN label CHARACTER VARYING (15);

UPDATE padmedtip SET label = 'Mail' WHERE cod = 'MAIL';
UPDATE padmedtip SET label = 'Numero' WHERE cod = 'TELEFONO';
UPDATE padmedtip SET label = 'Numero' WHERE cod = 'CELULAR';
UPDATE padmedtip SET label = 'Facebook' WHERE cod = 'FACEBOOK';
UPDATE padmedtip SET label = 'Instagram' WHERE cod = 'INSTAGRAM';
UPDATE padmedtip SET label = 'Twitter' WHERE cod = 'TWITTER';

ALTER TABLE padmedtip
ALTER COLUMN label SET NOT NULL;
/*-----------------------------------------------------------------------------------------------------------------*/



-- =====================================
SELECT aaversion('409.02');
-- =====================================
